﻿using System;
using System.Collections;

namespace Heaven.Graphics
{
    /// <summary>
    /// Интерфейс аппаратнозависимого буфера, реализация
    /// требуется для конкретного рендера (DirectX, OpenGL..)
    /// </summary>
    public abstract class HardwareBuffer
    {
        /// <summary>
        /// Запись в буфер
        /// </summary>
        /// <param name="data">Массив элементов буфера</param>
        /// <param name="start">Начальная позиция для записи</param>
        /// <param name="count">Количество элементов для записи</param>
        public abstract void Upload<T>(T[] data, int start, int count) where T : struct;

        /// <summary>
        /// Чтение из буфера
        /// </summary>
        /// <param name="start">Начиная с этого элемента буфера</param>
        /// <param name="count">Количество элементов для считывания</param>
        public abstract T[] Download<T>(int start, int count) where T : struct;

        /// <summary>
        /// Запись в буфер всех элементов переданного массива
        /// </summary>
        /// <param name="data">Массив элементов буфера</param>
        public void Upload<T>(T[] data) where T: struct
        {
            Upload(data, 0, data.Length);
        }

        /// <summary>
        /// Чтение из буфера всех элементов
        /// </summary>
        /// <returns>Содержимое буфера</returns>
        public T[] Download<T>() where T : struct
        {
            return Download<T>(0, BufferSize);
        }

        /// <summary>
        /// Количество элементов в буфере
        /// </summary>
        public abstract int BufferSize
        {
            get;
        }
    }
}
